package com.hd123.rumba.gwt.widget2.client.panel;

import com.google.gwt.user.client.ui.HasCaption;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.Widget;

/**
 * 标签页定义，用于配合标签面板RTabPanel使用
 * 
 * @author LiQi
 * 
 */
public class RTabDef {

  /** 所属标签面板 */
  private RTabPanel owner;

  /** 标签定义序号 */
  private int index = -1;

  /** 控件在DeckPanel中的序号 */
  private int contentIndex = -1;

  /** 标签标题 */
  private String caption;

  /** 是否显示关闭按钮 */
  private boolean showCloseButton = false;

  /** 包含的控件 */
  private Widget widget;

  /** 标签页是否可见 */
  private boolean visible = true;

  /** 标签栏控件 */
  private Widget tabBarWidget;

  /** 标签栏标题控件 */
  private Widget captionWidget;

  /** 标签栏关闭按钮 */
  private Widget closeButton;

  /** 是否自动整合RCaptionBox */
  private boolean integrateCaptionBox = true;

  public RTabDef() {
  }

  /**
   * @param caption
   *          标签标题
   */
  public RTabDef(String caption) {
    this();
    setCaption(caption);
  }

  /**
   * @param caption
   *          标签标题
   * @param widget
   *          包含的控件
   */
  public RTabDef(String caption, Widget widget) {
    this(caption);
    setWidget(widget);
  }

  /**
   * 所属标签面板
   * 
   * @return
   */
  public RTabPanel getOwner() {
    return owner;
  }

  /**
   * 设置所属标签面板，只能由RTabPanel设置
   * 
   * @param owner
   */
  void setOwner(RTabPanel owner) {
    this.owner = owner;
  }

  /**
   * 标签定义序号
   * 
   * @return
   */
  public int getIndex() {
    return index;
  }

  /**
   * 设置标签定义序号，和标签的显示顺序一致
   * 
   * @param index
   */
  public void setIndex(int index) {
    this.index = index;
  }

  /**
   * 控件在RTabPanel内容面板中的序号，因为可能存在延迟加载，所以此contentIndex和index不一定一致。
   * 如果标签页还没有控件，则contentIndex值为-1
   * 
   * @return
   */
  public int getContentIndex() {
    return contentIndex;
  }

  /**
   * 设置控件在RTabPanel内容面板中的序号
   * 
   * @param contentIndex
   */
  public void setContentIndex(int contentIndex) {
    this.contentIndex = contentIndex;
  }

  /**
   * 标签标题
   * 
   * @return
   */
  public String getCaption() {
    return caption;
  }

  /**
   * 设置标签标题
   * 
   * @param caption
   */
  public void setCaption(String caption) {
    this.caption = caption;
    refreshCaption();
  }

  /**
   * 刷新标题显示
   * 
   */
  void refreshCaption() {
    if (owner != null && captionWidget instanceof HasHTML) {
      String realCaption = caption;
      // 实现了HasCaption接口的控件的标题被显示在标签页上
      if (caption == null && widget instanceof HasCaption)
        realCaption = ((HasCaption) widget).getCaption();
      realCaption = realCaption == null ? "" : realCaption;

      //前后加上&nbsp;是为了避免纯中文字符串和英文字符串不对齐
      ((HasHTML) captionWidget).setHTML("&nbsp;" + realCaption + "&nbsp;");
    }
  }

  /**
   * 是否显示关闭按钮，默认为不显示
   * 
   * @return
   */
  public boolean isShowCloseButton() {
    return showCloseButton;
  }

  /**
   * 设置是否显示关闭按钮，默认为不显示
   * 
   * @param showCloseButton
   */
  public void setShowCloseButton(boolean showCloseButton) {
    this.showCloseButton = showCloseButton;
    if (closeButton != null) {
      closeButton.setVisible(showCloseButton);
    }
  }

  /**
   * 包含的控件
   * 
   * @return
   */
  public Widget getWidget() {
    return widget;
  }

  /**
   * 设置包含的控件
   * 
   * @param widget
   */
  public void setWidget(Widget widget) {
    this.widget = widget;
    if (owner != null)
      owner.refreshTabWidget(this);
  }

  /**
   * 标签页是否可见
   * 
   * @return
   */
  public boolean isVisible() {
    return visible;
  }

  /**
   * 设置标签页是否可见
   * 
   * @param visible
   */
  public void setVisible(boolean visible) {
    if (this.visible == visible)
      return;

    this.visible = visible;
    refreshVisibility();
  }

  /**
   * 可见性改变时的处理
   * 
   */
  void refreshVisibility() {
    if (tabBarWidget != null)
      tabBarWidget.setVisible(visible);

    // 如果被隐藏的是当前标签页，则重新选择新的当前标签页
    if (!visible && owner != null && this.equals(owner.getCurrentTabDef())) {
      // 找一个未隐藏的选中之
      boolean found = false;
      for (int i = 0; i < owner.getTabCount(); i++) {
        RTabDef tabDef = owner.getTabDef(i);
        if (tabDef.isVisible()) {
          owner.selectTab(tabDef);
          found = true;
          break;
        }
      }
      // 全部标签都已被隐藏则不选中任何标签
      if (!found)
        owner.selectTab(null);
    }
  }

  /**
   * 标签栏控件
   * 
   * @return
   */
  public Widget getTabBarWidget() {
    return tabBarWidget;
  }

  /**
   * 设置标签栏控件，只能由RTabPanel设置
   * 
   * @param tabBarWidget
   */
  void setTabBarWidget(Widget tabBarWidget) {
    this.tabBarWidget = tabBarWidget;
  }

  /**
   * 标签栏标题控件
   * 
   * @return
   */
  public Widget getCaptionWidget() {
    return captionWidget;
  }

  /**
   * 设置标签栏标题控件，只能由RTabPanel设置
   * 
   * @param captionWidget
   */
  void setCaptionWidget(Widget captionWidget) {
    this.captionWidget = captionWidget;
  }

  /**
   * 标签栏关闭按钮
   * 
   * @return
   */
  public Widget getCloseButton() {
    return closeButton;
  }

  /**
   * 设置标签栏关闭按钮，只能由RTabPanel设置
   * 
   * @param closeButton
   */
  void setCloseButton(Widget closeButton) {
    this.closeButton = closeButton;
  }

  /**
   * 是否自动整合RCaptionBox，默认为true。
   * <p>
   * 整合的行为包括：
   * <p>
   * <li>RCaptionBox的标题显示为标签页的标题
   * <li>隐藏RCaptionBox的RCaptionBar
   * 
   * @return
   */
  public boolean isIntegrateCaptionBox() {
    return integrateCaptionBox;
  }

  /**
   * 设置是否自动整合RCaptionBox
   * 
   * @param integrateCaptionBox
   */
  public void setIntegrateCaptionBox(boolean integrateCaptionBox) {
    this.integrateCaptionBox = integrateCaptionBox;
    refreshCaptionBox();
  }

  /**
   * 刷新包含的RCaptionBox
   * 
   */
  void refreshCaptionBox() {
    if (!(widget instanceof RCaptionBox))
      return;
    RCaptionBox captionBox = (RCaptionBox) getWidget();

    if (integrateCaptionBox) {
      ((HasHTML) captionWidget).setHTML("&nbsp;" + captionBox.getCaption() + "&nbsp;");
      captionBox.getCaptionBar().setVisible(false);
    } else {
      refreshCaption();
      captionBox.getCaptionBar().setVisible(true);
    }
  }

}
